package com.gewu.pm.ui.activity.base;

import android.os.Bundle;
import android.os.Handler;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.gewu.pm.R;
import com.gewu.pm.app.AppActivity;
import com.gewu.pm.app.AppAdapter;
import com.hjq.base.BaseAdapter;
import com.hjq.widget.view.EmptyView;
import com.scwang.smart.refresh.layout.SmartRefreshLayout;
import com.scwang.smart.refresh.layout.api.RefreshLayout;
import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener;

import java.util.ArrayList;
import java.util.List;

/**
 * 通用管理页面基类
 * 适用于：拜访管理、拜访记录、冰柜管理、促销拜访、金豆管理、终端管理、配送商管理、业务员管理
 * 
 * 功能：
 * 1. 搜索框（支持防抖）
 * 2. "共X条记录"（可选显示）
 * 3. 右侧红色文字（如"拜访记录"，可选显示）
 * 4. 下拉刷新 + 上拉加载
 * 5. 空数据视图
 * 6. 底部按钮（如"新增冰柜"，可选显示）
 * 7. 右上角筛选按钮
 */
public abstract class BaseManagementActivity<T> extends AppActivity
        implements BaseAdapter.OnItemClickListener, OnRefreshLoadMoreListener {

    /** 搜索防抖延迟（毫秒） */
    private static final long SEARCH_DELAY = 300;

    protected SmartRefreshLayout mRefreshLayout;
    protected EmptyView mEmptyView;
    protected RecyclerView mRecyclerView;
    protected EditText mSearchEdit;
    protected TextView mRecordCountView;      // "共X条记录"
    protected TextView mRightActionView;      // 右侧红色文字（如"拜访记录"）
    protected LinearLayout mBottomLayout;     // 底部按钮布局
    protected TextView mBottomButton;         // 底部按钮
    protected AppAdapter<T> mAdapter;
    protected List<T> mDataList = new ArrayList<>();           // 当前显示的数据
    private List<T> mOriginalDataList = new ArrayList<>();     // 原始数据（用于搜索）

    private Handler mSearchHandler = new Handler();
    private Runnable mSearchRunnable;
    private String mCurrentKeyword = "";  // 当前搜索关键字

    @Override
    protected int getLayoutId() {
        return R.layout.activity_delivery_provider;  // 通用布局
    }

    @Override
    protected void initView(Bundle savedInstanceState) {
        mSearchEdit = findViewById(R.id.et_search);
        mRecyclerView = findViewById(R.id.rv_list);
        mRecordCountView = findViewById(R.id.tv_number);
        mRightActionView = findViewById(R.id.record);
        mBottomLayout = findViewById(R.id.layout_bottom);
        mBottomButton = findViewById(R.id.tv_ok);
        mRefreshLayout = findViewById(R.id.srl_refresh);
        mEmptyView = findViewById(R.id.empty_view);

        // 设置 RecyclerView
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        mAdapter = createAdapter();
        mAdapter.setOnItemClickListener(this);
        mRecyclerView.setAdapter(mAdapter);

        // 设置刷新监听
        mRefreshLayout.setOnRefreshLoadMoreListener(this);

        // 设置搜索监听
        setupSearchListener();

        // 设置右侧红色文字点击
        setupRightAction();

        // 设置底部按钮点击
        setupBottomButton();
    }

    @Override
    protected void initData() {
        setTitle(getPageTitle());
        mSearchEdit.setHint(getSearchHint());

        // 配置"共X条记录"显示
        mRecordCountView.setVisibility(showRecordCount() ? View.VISIBLE : View.GONE);

        // 配置右侧红色文字
        String rightActionText = getRightActionText();
        if (TextUtils.isEmpty(rightActionText)) {
            mRightActionView.setVisibility(View.GONE);
        } else {
            mRightActionView.setVisibility(View.VISIBLE);
            mRightActionView.setText(rightActionText);
        }

        // 配置底部按钮
        String bottomButtonText = getBottomButtonText();
        if (TextUtils.isEmpty(bottomButtonText)) {
            mBottomLayout.setVisibility(View.GONE);
        } else {
            mBottomLayout.setVisibility(View.VISIBLE);
            mBottomButton.setText(bottomButtonText);
        }

        // 加载数据
        loadData();
    }

    /**
     * 设置搜索监听（防抖处理）
     */
    private void setupSearchListener() {
        mSearchEdit.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {}

            @Override
            public void afterTextChanged(Editable s) {
                if (mSearchRunnable != null) {
                    mSearchHandler.removeCallbacks(mSearchRunnable);
                }
                mSearchRunnable = () -> onSearchTextChanged(s.toString().trim());
                mSearchHandler.postDelayed(mSearchRunnable, SEARCH_DELAY);
            }
        });
    }

    /**
     * 设置右侧红色文字点击
     */
    private void setupRightAction() {
        mRightActionView.setOnClickListener(v -> onRightActionClick());
    }

    /**
     * 设置底部按钮点击
     */
    private void setupBottomButton() {
        mBottomButton.setOnClickListener(v -> onBottomButtonClick());
    }

    /**
     * 更新"共X条记录"显示
     */
    protected void updateRecordCount() {
        if (showRecordCount()) {
            mRecordCountView.setText(String.format("共%d条记录", mDataList.size()));
        }
    }

    /**
     * 更新空数据视图
     */
    protected void updateEmptyView() {
        if (mDataList == null || mDataList.isEmpty()) {
            mEmptyView.show();
            mRecyclerView.setVisibility(View.GONE);
        } else {
            mEmptyView.hide();
            mRecyclerView.setVisibility(View.VISIBLE);
        }
    }

    @Override
    public void onRightClick(View view) {
        super.onRightClick(view);
        // 点击右上角筛选按钮
        onFilterClick();
    }

    @Override
    public void onRefresh(@NonNull RefreshLayout refreshLayout) {
        postDelayed(() -> {
            loadData();
            mRefreshLayout.finishRefresh();
            toast("刷新成功");
        }, 1000);
    }

    @Override
    public void onLoadMore(@NonNull RefreshLayout refreshLayout) {
        postDelayed(() -> {
            loadMoreData();
            mRefreshLayout.finishLoadMore();
        }, 1000);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mSearchHandler != null) {
            mSearchHandler.removeCallbacksAndMessages(null);
        }
    }

    // ========== 子类必须实现的抽象方法 ==========

    /**
     * 获取页面标题
     */
    protected abstract String getPageTitle();

    /**
     * 获取搜索提示文字
     */
    protected abstract String getSearchHint();

    /**
     * 创建适配器
     */
    protected abstract AppAdapter<T> createAdapter();

    /**
     * 加载数据
     */
    protected abstract void loadData();

    // ========== 子类可选实现的方法（带默认值） ==========

    /**
     * 是否显示"共X条记录"
     * 默认：不显示
     */
    protected boolean showRecordCount() {
        return false;
    }

    /**
     * 获取右侧红色文字（如"拜访记录"）
     * 默认：不显示（返回 null）
     */
    protected String getRightActionText() {
        return null;
    }

    /**
     * 获取底部按钮文字（如"新增冰柜"）
     * 默认：不显示（返回 null）
     */
    protected String getBottomButtonText() {
        return null;
    }

    /**
     * 加载更多数据
     * 默认：提示暂无更多
     */
    protected void loadMoreData() {
        toast("暂无更多数据");
    }

    /**
     * 搜索文字改变
     * 默认：执行模糊搜索
     */
    protected void onSearchTextChanged(String keyword) {
        mCurrentKeyword = keyword;
        performSearch(keyword);
    }

    /**
     * 执行模糊搜索
     */
    private void performSearch(String keyword) {
        if (TextUtils.isEmpty(keyword)) {
            // 关键字为空，显示全部数据
            mDataList.clear();
            mDataList.addAll(mOriginalDataList);
            mAdapter.setData(mDataList);
        } else {
            // 执行模糊搜索
            List<T> filteredList = new ArrayList<>();
            for (T item : mOriginalDataList) {
                String searchText = getSearchText(item);
                if (!TextUtils.isEmpty(searchText) && searchText.contains(keyword)) {
                    filteredList.add(item);
                }
            }
            mDataList.clear();
            mDataList.addAll(filteredList);
            mAdapter.setData(mDataList);
        }
        
        updateRecordCount();
        updateEmptyView();
    }

    /**
     * 从 Item 中提取搜索文本（通常是左上角的文字）
     * 子类必须实现，指定搜索哪个字段
     * 
     * @param item 数据项
     * @return 用于搜索的文本
     */
    protected abstract String getSearchText(T item);

    /**
     * 设置原始数据（用于搜索）
     * 在 loadData() 中调用此方法保存原始数据
     */
    protected void setOriginalData(List<T> data) {
        mOriginalDataList.clear();
        if (data != null) {
            mOriginalDataList.addAll(data);
        }
    }

    /**
     * 右侧红色文字点击（如"拜访记录"）
     * 默认：不处理
     */
    protected void onRightActionClick() {
        // 子类可重写实现跳转逻辑
    }

    /**
     * 底部按钮点击（如"新增冰柜"）
     * 默认：不处理
     */
    protected void onBottomButtonClick() {
        // 子类可重写实现按钮逻辑
    }

    /**
     * 筛选按钮点击
     * 默认：不处理
     */
    protected void onFilterClick() {

    }
}

